Rust 的型別是非常重要的,因為它可以幫助我們在編譯時期就找出錯誤,而不是在執行時期才發現錯誤。
所以我們要了解一下 Rust 的型別,並且要知道如何使用它,才能夠感受到 Rust 帶來的好處。
Rust 主要有 4 種基本型別:
整數有兩種變形,分為非帶號(Unsigned)、帶號(Signed):
長度 | Unsigned | Signed |
---|---|---|
8位元 | u8 | i8 |
16 位元 | i16 | u16 |
32 位元 | i32 | u32 |
64 位元 | i64 | u64 |
128 位元 | i128 | u128 |
系統架構 | isize | usize |
兩個的差異在在負號的差別,帶號就是帶負號,每一個帶號可以儲存的數字範圍從 -(2n - 1) 到 2n-1 -1 以內的數字,n
是位元,例如 8 位元的 i8
最小到 -128,最大到 127;而非帶號的 u8
最小因為沒有負數,所以就從 0 開始,最大到 255。
比較特別的是 isize
和 usize
是依據使用者程式運行的電腦架構來決定大小,如果在 64 位元架構的電腦上就是 64 位元,以此類推。
那麼該使用那些整數型別呢?如果不確定的話,那就可以使用 Rust 的預設型別 - i32
。
浮點數相對整數來說單純很多,只有兩種型別:
分別代表 32 位元和 64 位元,預設的型別是 f64
,擁有更高的精準度,如果沒有特別需求的話就用 f64
就可以了。所有的浮點數型別都是帶號。
了解了數字的基本型別之後,就來寫點 code 來練習一下吧:
fn main() {
let a: i32 = -5;
let b: u32 = 10;
let c: f64 = 3.5;
let sum = b + 10;
let negative: i32 = a - 10;
let product: f64 = c * 3.0;
let remainder: f64 = c / 3.0;
println!(
"sum: {}, negative: {}, product: {}, remainder: {}",
sum, negative, product, remainder
);
}
運算的結果如下圖:
布林型別也非常簡單,只有 true
和 false
,要定義布林型別的話加上 bool
就可以使用了。
以下是使用範例:
fn main() {
let num = 5;
let x: bool = true;
let y: bool = false;
if num < 10 {
println!("{}", x)
} else {
println!("{}", y)
}
}
字元跟字串不太一樣,宣告是用單引號,代表一個 Unicode 值,大小為四個位元組,不管是中英日韓、表情符號都是屬於字元型別:
fn main() {
let a = 'a';
let you_tw = '你';
let cat = '?';
println!("{} {} {}", a, you_tw, cat);
}
雖然 Rust 是屬於強型別的語言,但是 Rust 的一些型別是可以自動推導的,例如上面的 a
,因為它是字元型別,Rust 會自動推導出它是 char
型別,所以是可以不需要特地加上 char
。
也因為如此,雖然型別對於一些寫久了弱型別的工程師來說可能會覺得有點麻煩,但是在寫程式的時候,不用一直去想這個變數是什麼型別,可以更專注在程式的邏輯上。
本文同步發表於我的技術部落格,歡迎大家有空去參觀。